package qc.module.ehs.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import qc.common.core.enums.ResourceStatusFlagEnum;
import qc.common.core.unify.QCUnifyReturnValue;
import qc.common.core.utils.IdentifierUtil;
import qc.module.ehs.dto.check.CheckItemBatchAddDto;
import qc.module.ehs.dto.check.CheckItemDto;
import qc.module.ehs.entity.EhsCheckItem;
import qc.module.ehs.mapper.EhsCheckItemMapper;
import qc.module.ehs.repository.EhsCheckItemRepository;

import java.util.List;
import java.util.Objects;

/**
 * 检查项信息接口Service
 *
 * @author QuCheng Tech
 * @create 2024/10/23
 */
@Service
public class EhsCheckItemService {

    @Autowired
    private EhsCheckItemRepository repository;

    @Autowired
    private EhsCheckTableService checkTableService;

    @Autowired
    private EhsCheckGroupService checkGroupService;

    /**
     * 获取指定分组的检查项
     *
     * @param groupId 检查表分组ID
     * @return List<CheckItemDto>
     * @author QuCheng Tech
     * @since 2024/10/24
     */
    public List<CheckItemDto> getGroupItems(String groupId) {

        LambdaQueryWrapper<EhsCheckItem> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(EhsCheckItem::getGroupid, groupId);
        //检查项排序
        wrapper.orderByAsc(EhsCheckItem::getOdr).orderByAsc(EhsCheckItem::getTableid);
        List<EhsCheckItem> ens = repository.selectList(wrapper);
        if (CollectionUtils.isNotEmpty(ens)) {
            return EhsCheckItemMapper.MAPPER.toDtoList(ens);
        }
        return null;
    }

    /**
     * 获取指定检查项
     *
     * @param id 检查项ID
     * @return CheckItemDto
     * @author QuCheng Tech
     * @since 2024/10/24
     */
    public CheckItemDto get(String id) {

        EhsCheckItem en = repository.selectById(id);
        if (Objects.nonNull(en)) {
            return EhsCheckItemMapper.MAPPER.toDto(en);
        }
        return null;
    }

    /**
     * 新增检查项
     *
     * @param dto 新增对象DTO
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/10/24
     */
    public String add(CheckItemDto dto) {
        //1.DTO有效性验证
        if (StringUtils.isBlank(dto.getGroupid())) return QCUnifyReturnValue.Warn("分组ID不能为空");
        if (StringUtils.isBlank(dto.getTableid())) return QCUnifyReturnValue.Warn("检查表ID不能为空");
        if (StringUtils.isBlank(dto.getTitle())) return QCUnifyReturnValue.Warn("标题不能为空");
        if (!checkGroupService.isExist(dto.getGroupid())) return QCUnifyReturnValue.Warn("指定检查分组信息不存在");
        if (!checkTableService.isExist(dto.getTableid())) return QCUnifyReturnValue.Warn("指定检查表信息不存在");

        //2.dto -> entity
        EhsCheckItem en = EhsCheckItemMapper.MAPPER.dtoToEntity(dto);
        en.setItemid(IdentifierUtil.randomUUID());

        //3.保存数据
        if (repository.insert(en) < 0x1) {
            return QCUnifyReturnValue.Warn("保存失败");
        }
        return QCUnifyReturnValue.Success();
    }

    /***
     * 批量新增检查项
     *
     * @param dto 批量新增检查项DTO
     * @return java.lang.String
     * @author QuCheng Tech
     * @since 2025/2/10
     */
    public String batchAdd(CheckItemBatchAddDto dto) {
        //1.DTO有效性验证
        if (StringUtils.isBlank(dto.getGroupid()))
            return QCUnifyReturnValue.Warn("分组ID不能为空");
        if (StringUtils.isBlank(dto.getTableid()))
            return QCUnifyReturnValue.Warn("检查表ID不能为空");
        if (dto.getTitle() == null || dto.getTitle().size() < 0x1)
            return QCUnifyReturnValue.Warn("新增的检查项标题不能为空");
        if (dto.getOptions() == null || dto.getOptions().size() < 0x1)
            return QCUnifyReturnValue.Warn("新增的检查项待选择项不能为空");
        if (dto.getTitle().size() != dto.getOptions().size())
            return QCUnifyReturnValue.Warn("新增的检查项标题和待选择项数量不一致");
        if (!checkGroupService.isExist(dto.getGroupid()))
            return QCUnifyReturnValue.Warn("指定检查分组信息不存在");
        if (!checkTableService.isExist(dto.getTableid()))
            return QCUnifyReturnValue.Warn("指定检查表信息不存在");

        for (int i = 0; i < dto.getTitle().size(); i++) {
            String title = dto.getTitle().get(i);
            //如果标题为空不进行保存
            if (StringUtils.isNotBlank(title)) {
                EhsCheckItem en = new EhsCheckItem();
                //生成ID
                en.setItemid(IdentifierUtil.randomUUID());
                en.setGroupid(dto.getGroupid());
                en.setTableid(dto.getTableid());
                en.setTitle(title);
                en.setStatus(ResourceStatusFlagEnum.NORMAL);
                en.setNotnull(dto.isNotnull());
                en.setOptions(dto.getOptions().get(i));
                en.setContenttype(dto.getContenttype());
                en.setMinimgcount(dto.getMinimgcount());
                //顺序与加入的顺序保持一致
                en.setOdr(i + 1);

                if (repository.insert(en) < 0x1) {
                    return QCUnifyReturnValue.Warn("保存失败");
                }
            }
        }

        return QCUnifyReturnValue.Success();
    }

    /**
     * 修改检查表
     *
     * @param dto 修改对象DTO
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/10/24
     */
    public String update(CheckItemDto dto) {
        //1.DTO有效性验证
        if (StringUtils.isBlank(dto.getItemid())) return QCUnifyReturnValue.Warn("检查项ID不能为空");
        if (StringUtils.isBlank(dto.getGroupid())) return QCUnifyReturnValue.Warn("分组ID不能为空");
        if (StringUtils.isBlank(dto.getTableid())) return QCUnifyReturnValue.Warn("检查表ID不能为空");
        if (StringUtils.isBlank(dto.getTitle())) return QCUnifyReturnValue.Warn("标题不能为空");
        if (!isExist(dto.getItemid())) return QCUnifyReturnValue.Warn("指定检查项信息不存在");
        if (!checkGroupService.isExist(dto.getGroupid())) return QCUnifyReturnValue.Warn("指定检查分组信息不存在");
        if (!checkTableService.isExist(dto.getTableid())) return QCUnifyReturnValue.Warn("指定检查表信息不存在");

        //2.dto -> entity
        EhsCheckItem en = EhsCheckItemMapper.MAPPER.dtoToEntity(dto);

        //3.更新数据
        repository.updateById(en);
        return QCUnifyReturnValue.Success();
    }

    /**
     * 删除检查项
     *
     * @param id            检查项ID
     * @param isLogicDelete 是否为逻辑删除；为true表示逻辑删除--修改记录标记，为false表示物理删除--从数据库表中删除记录
     * @return 成功返回null，失败返回错误或提示信息
     * @author QuCheng Tech
     * @since 2024/10/24
     */
    public String delete(String id, boolean isLogicDelete) {

        if (isLogicDelete) {
            //逻辑删除：修改检查项状态
            EhsCheckItem item = repository.selectById(id);
            item.setStatus(ResourceStatusFlagEnum.DELETED);
            repository.updateById(item);
        } else {
            //物理删除
            repository.deleteById(id);
        }

        return QCUnifyReturnValue.Success();
    }

    /**
     * 指定检查项是否存在
     *
     * @param id 检查项ID
     * @return true表示存在，false表示不存在
     */
    public boolean isExist(String id) {
        EhsCheckItem en = repository.selectById(id);

        if (Objects.nonNull(en)) return true;
        return false;
    }
}
